#include <tbf.h>

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/time.h>

#define BUFSIZE 32

#define BURST ((CPS) * 10)
#define CPS 10
#define CNT 10

int mycpy(int rfd, int wfd);

int main(int argc, char **argv) {
	int fd;

	if (argc < 2)
		return 1;

	fd = open(argv[1], O_RDONLY);
	if (-1 == fd) {
		perror("Error opening file");
		return 1;
	}

	mycpy(fd, 1);

	close(fd);

	return 0;
}

int mycpy(int rfd, int wfd)
{
	char buf[BUFSIZE] = {0};
	int cnt;
	int td; // 令牌描述符

	td = tbf_init(CPS, BURST);

	//printf("tbf init: %d\n", td);

	while (1) {
		tbf_fetch_token(td, CNT);
		//printf("tbf fetch: %d tokens\n", CNT);
		memset(buf, 0, BUFSIZE);
		cnt = read(rfd, buf, CNT);

		if (cnt < CNT) {
			// 实际读出来的比花费的token少，把多出来的token放回去
			tbf_return_token(td, CNT - cnt);
		}
		
		if (0 == cnt) { // 读完了
			break;
		} else if (-1 == cnt) {
			perror("Error reading file");
			return -1;
		}
		write(wfd, buf, cnt);
	}
	tbf_destroy(td);
}

